上面的 bigram 很好懂,它的特點就是簡單且直觀,只要考慮相鄰的詞的關係,而且還能夠保留有順序性的資訊,計算效率也高,只要順著文序、看相臨的詞一次就好,而且只要看結果,就能夠解釋意義。
不過,它的好懂優點,也能視為缺點,因為它會損失大量資訊,例如不是相鄰的詞彙就抓不到,可是我們常常會在講話中插入一些幫忙的詞、習慣用語,例如「肚子餓」和「肚子很餓」以及「肚子超餓」就會被視為不同的
bigram,關鍵意義其實還是「肚子餓」,但 bigram 無法捕捉到,稍微複雜一些的詞彙關係全部都會流失。
如果你學過統計,一定聽過相關(correlation),這個指標也能拿來看詞彙之間的關係。它能夠不只是評估相鄰的詞,改成看整份文章、整個章節、整個段落,而且穩健程度(robustness)更高,就算你在用詞中加入更多變化,它還是可以捕捉到肚子餓,因為他看的不是相鄰的詞,而是同一個單位(文章、章節、段落、句子)當中是否有共同出現的詞彙,所以更穩定,再加上他的統計特性,有其他變化可以處理。
當然,有得必有失,在計算上要花更多時間,你可以想像當詞彙數量上升,它的計算複雜度不像 bigram 的線性,而是以平方成長。此外,決定單位也是一個重點,要選哪一個單位來衡量、要用什麼樣的標準當成相關性門檻(threshold)都是重點,而且如果共同出現次數低、但相關性高,這種結果也有可能誤導人,所以這是門艱深的學問。
不過,它的程式碼相對簡單,已經有專門套件專門處理。
### text part
df_speech_seg
## # A tibble: 27,125 × 7
## id title date president text_segment text_POS text
## <dbl> <chr> <date> <chr> <chr> <chr> <chr>
## 1 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 大會 n 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 2 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 主席 n 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 3 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 貴賓 ns 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 4 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 親愛 a 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 5 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 父老兄弟 n 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 6 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 姐妹 n 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 7 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 今天 t 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 8 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 中華民國 n 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 9 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 八十六年 m 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## 10 1 總統蒞臨中華民國八十六年國慶大會致詞 1997-10-15 李登輝 國慶日 t 大會主席、各位貴賓、各位親愛的父老兄弟姐妹:今天是中華民國八十六…
## # ℹ 27,115 more rows
我們載入特別開發的套件wider
。
library(widyr)
先計算co-occuring word pair,也就是詞彙組的概念,以演講稿為單位,也就是以年份為單位,看他們成對出現的關係。
# count words co-occuring within year
word_pairs <- df_speech_seg %>%
pairwise_count(text_segment, id, sort = TRUE)
word_pairs
## # A tibble: 9,799,326 × 3
## item1 item2 n
## <chr> <chr> <dbl>
## 1 中華民國 今天 24
## 2 國家 今天 24
## 3 民主 今天 24
## 4 社會 今天 24
## 5 發展 今天 24
## 6 推動 今天 24
## 7 國際 今天 24
## 8 今天 中華民國 24
## 9 國家 中華民國 24
## 10 民主 中華民國 24
## # ℹ 9,799,316 more rows
接著計算co-occuring word pair relations,也就是詞彙共現的概念,以演講稿為單位,也就是以年份為單位,看他們成對出現的關係。
### 計算 correlation
word_cors <- df_speech_seg %>%
group_by(text_segment) %>%
filter(n() >= 20) %>%
pairwise_cor(text_segment, id, sort = TRUE)
word_cors %>% head(200) %>% filter(row_number()%%2 == 0) %>% sample_n(20)
## # A tibble: 20 × 3
## item1 item2 correlation
## <chr> <chr> <dbl>
## 1 超過 重要 0.669
## 2 今年 後 0.747
## 3 投資 進行 0.747
## 4 兩千 三百萬 0.698
## 5 經濟 臺灣 1
## 6 總統 去年 0.707
## 7 好 院長 0.713
## 8 年 總統 0.730
## 9 現在 日本 0.753
## 10 副 閣下 0.828
## 11 市場 做 0.678
## 12 政府 最 0.692
## 13 協定 架構 0.759
## 14 協定 閣下 0.798
## 15 最 政府 0.692
## 16 國人 應該 0.745
## 17 超過 地區 0.713
## 18 閣下 協定 0.798
## 19 大會 主席 0.730
## 20 好 所有 0.713
word_cors %>% head(200) %>% filter(row_number()%%2 == 0) %>% sample_n(20)
## # A tibble: 20 × 3
## item1 item2 correlation
## <chr> <chr> <dbl>
## 1 成果 正在 0.713
## 2 以來 穩定 0.683
## 3 化 價值 0.676
## 4 重要 超過 0.669
## 5 協定 架構 0.759
## 6 政治 問題 0.698
## 7 人 超過 0.745
## 8 展現 強化 0.737
## 9 重要 地區 0.678
## 10 協定 臺 0.828
## 11 協定 副 0.828
## 12 年 總統 0.730
## 13 歷史 臺灣 0.692
## 14 市場 做 0.678
## 15 臺 副 0.822
## 16 經濟 臺灣 1
## 17 協議 鄉親 0.799
## 18 這是 美國 0.707
## 19 臺 大陸 0.775
## 20 許多 環境 0.697
word_cors %>% head(200) %>% filter(row_number()%%2 == 0) %>% sample_n(20)
## # A tibble: 20 × 3
## item1 item2 correlation
## <chr> <chr> <dbl>
## 1 日本 應該 0.713
## 2 副 閣下 0.828
## 3 協定 臺 0.828
## 4 協定 九二 0.698
## 5 經濟 臺灣 1
## 6 增加 應該 0.669
## 7 閣下 協定 0.798
## 8 整合 進步 0.676
## 9 前 現在 0.676
## 10 日本 副 0.669
## 11 和平 合作 0.692
## 12 受到 捍衛 0.749
## 13 創造 目前 0.698
## 14 新 基礎 0.692
## 15 萬 服務 0.698
## 16 人 超過 0.745
## 17 未來 政府 1
## 18 時 超過 0.713
## 19 原則 已 0.713
## 20 美國 日本 0.920